home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / RoasterJavaWAHTTPCGI.sit / Roaster-Java-WA-HTTP-CGI hack / JavaWebStuff / DSJava.c < prev    next >
Text File  |  1996-06-22  |  15KB  |  631 lines

  1. /*************************************************************************************
  2.  
  3.     DSJava.c
  4.     written by Chris Evans & Rick Eames
  5.     (c) 1996 Natural Intelligence, Inc.   All Rights Reserved.
  6.     
  7.     This file holds the key to life for using Java in your applications.
  8.         
  9.     Questions for Chris
  10.     
  11. *************************************************************************************/
  12.  
  13. #include "RoasterVM.h"
  14. #include "JavaRuntime.h"
  15. #include <ctype.h>
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include "UnixPaths.h"
  19. #include "DSUtils.h"
  20.  
  21. /*************************************************************************************
  22.     PROTOTYPES
  23. *************************************************************************************/
  24.  
  25. static     Handle GetFullPathName(FSSpec *inFileSpec);
  26. static     Boolean abortKeyPressed(void);
  27. static    Boolean ErrorWithFileNameAndLineNumber(char    *str,long    len);
  28. static     JavaStatus mac_tools_CompilerExceptionStream_writeBytes(JavaEnv env,
  29.                     JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
  30. static     JavaStatus mac_tools_CompilerErrorStream_writeBytes(JavaEnv env,
  31.                     JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
  32. static     JavaStatus mac_tools_CompilerErrorStream_writeBytes_stub(JavaEnv env);
  33. static     JavaStatus mac_tools_CompilerExceptionStream_writeBytes_stub(JavaEnv env);
  34. OSErr    Java_ProcessFile(FSSpec *inFSSpec);
  35. short    BuildClassPathStringHandle(Handle classPath,JavaRuntime    runtime, FSSpec *inFSSpec);
  36.  
  37. /*************************************************************************************
  38.     
  39.     abortKeyPressed
  40.     
  41.     Was the command-period pressed during our operation?
  42.     
  43. *************************************************************************************/
  44.  
  45. static Boolean 
  46. abortKeyPressed(void)
  47. {
  48.     KeyMap    theKeys;
  49.     UInt8    *km = (UInt8 *) theKeys;
  50. # define KEYDOWN(k)    (((km[k>>3] >> (k & 7)) & 1) != 0)
  51.     GetKeys(theKeys);
  52.     return (KEYDOWN(0x37) && KEYDOWN(0x2F));
  53. # undef KEYDOWN
  54. }
  55.  
  56. /*************************************************************************************
  57.  
  58.     GetFullPathName
  59.     
  60.     Given an FSSpec, return a full pathname in a Handle.
  61.     
  62. *************************************************************************************/
  63.  
  64. static Handle
  65. GetFullPathName(
  66.     FSSpec    *inFileSpec)
  67. {
  68.     Str255        theStr;
  69.     CInfoPBRec    pb;
  70.     Handle        theString;
  71.     char        sep = '/';
  72.  
  73.     if ((theString = NewHandle(0)) == NULL)
  74.         return NULL;
  75.     BlockMoveData(inFileSpec->name,
  76.         theStr, inFileSpec->name[0]+1);
  77.     Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
  78.     pb.hFileInfo.ioNamePtr = theStr;
  79.     pb.hFileInfo.ioVRefNum = inFileSpec->vRefNum;
  80.     pb.hFileInfo.ioCompletion = NULL;
  81.     pb.hFileInfo.ioFDirIndex = -1;
  82.     pb.dirInfo.ioDrDirID = inFileSpec->parID;
  83.     while (TRUE) {
  84.         if (PBGetCatInfoSync( &pb ))
  85.             break;
  86.         Munger(theString, 0, 0, 0, &sep, 1);
  87.         Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
  88.         pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID;
  89.         pb.hFileInfo.ioFDirIndex = -1;
  90.     }
  91.     Munger(theString, 0, 0, 0, &sep, 1);
  92.     return theString;
  93. }
  94.  
  95.  
  96. /*************************************************************************************
  97.  
  98.     ErrorWithFileNameAndLineNumber
  99.     
  100.     
  101. *************************************************************************************/
  102.  
  103. static Boolean 
  104. ErrorWithFileNameAndLineNumber(
  105.     char    *str,
  106.     long    len)
  107. {
  108.     char    *bytes = str;
  109.  
  110.     while (*bytes != ':' && len)
  111.     {
  112.         bytes += 1;
  113.         len -= 1;
  114.     }
  115.     if (len && *bytes == ':')
  116.     {
  117.         bytes += 1;
  118.         len -= 1;
  119.         if (*bytes >= '0' && *bytes <= '9')
  120.         {
  121.             bytes += 1;
  122.             len -= 1;
  123.             while (*bytes != ':' && len)
  124.             {
  125.                 bytes += 1;
  126.                 len -= 1;
  127.             }
  128.             return (len && *bytes == ':');
  129.         }
  130.     }
  131.     return false;
  132. }
  133.  
  134. /*************************************************************************************
  135.  
  136.     mac_tools_CompilerExceptionStream_writeBytes
  137.     
  138. *************************************************************************************/
  139.  
  140. static JavaStatus
  141. mac_tools_CompilerExceptionStream_writeBytes(
  142.     JavaEnv     env,
  143.     JavaRef     thisRef, 
  144.     JavaRef     arrayRef, 
  145.     JavaInt     off, 
  146.     JavaInt     len)
  147. {
  148.     char        *bytes;
  149.     FSSpec        theSpec, appSpec;
  150.     short        fRefNum;
  151.     OSErr        theErr;
  152.     JavaStatus    err;
  153.     
  154.     
  155.     GetAppFSSpec(&appSpec);
  156.     
  157.     err = JavaArray_baseAddr(env, arrayRef, &bytes);
  158.     if (err != JavaStatusOk)
  159.     {
  160.         return err;
  161.     }
  162.     bytes += off;
  163.  
  164.     theErr = UnixParsePath("javac_error.log",
  165.         appSpec.vRefNum, appSpec.parID, false, false, true, true, 'Rstr', 'TEXT', "\p", NULL, &theSpec);
  166.     theErr = FSpOpenDF(&theSpec, fsWrPerm, &fRefNum);
  167.     if (theErr == noErr)
  168.     {
  169.         SetFPos(fRefNum, fsFromLEOF, 0);
  170.         FSWrite(fRefNum, &len, bytes);
  171.     }
  172.     FSClose(fRefNum);
  173.     return JavaStatusOk;
  174. }
  175.  
  176. /*************************************************************************************
  177.  
  178.     mac_tools_CompilerErrorStream_writeBytes
  179.     
  180. *************************************************************************************/
  181.  
  182. static JavaStatus
  183. mac_tools_CompilerErrorStream_writeBytes(
  184.     JavaEnv     env,
  185.     JavaRef     thisRef, 
  186.     JavaRef     arrayRef, 
  187.     JavaInt     off, 
  188.     JavaInt     len)
  189. {
  190. #if 1
  191.     FSSpec        theSpec = { 0, 0, "\p" }, appSpec;
  192.     long        lineNum = 0;
  193.     char        *bytes;
  194.     JavaStatus    err;
  195.     Boolean        warning = false;
  196.     static char    err_buffer[2000];
  197.     Boolean        cancelNow;
  198.     static         unsigned long nextMessageTicks = 0;
  199.     
  200.     GetAppFSSpec(&appSpec);
  201.     
  202.     err = JavaArray_baseAddr(env, arrayRef, &bytes);
  203.     if (err != JavaStatusOk)
  204.     {
  205.         return err;
  206.     }
  207.     bytes += off;
  208.     len = (sizeof(err_buffer) < len) ? sizeof(err_buffer) - 1 : len;
  209.     if (*bytes == ' ' || *bytes == '\t' || *bytes == '^')
  210.     {
  211.         return JavaStatusOk;
  212.     }
  213.  
  214.     if (*bytes == '[')
  215.     {
  216.         strncpy(err_buffer, bytes + 1, len - 3);
  217.         err_buffer[len - 3] = '\0';
  218.         printf("%s\n",err_buffer);
  219.         cancelNow = abortKeyPressed();
  220.         if(cancelNow) {
  221.             return JavaStatusExceptionThrown;
  222.         }
  223.     
  224.         return JavaStatusOk;
  225.     }
  226.     else if (ErrorWithFileNameAndLineNumber(bytes, len))
  227.     {
  228.         long    i = 0;
  229.         while (*bytes != ':' && len)
  230.         {
  231.             err_buffer[i++] = *bytes++;
  232.             err_buffer[i] = '\0';
  233.             len -= 1;
  234.         }
  235.         if (*bytes == ':')
  236.         {
  237.             OSErr    theErr;
  238.             theErr = UnixParsePath(err_buffer, appSpec.vRefNum,
  239.                 appSpec.parID, false, false, false, true, 0, 0, "\p", NULL, &theSpec);
  240.             if (theErr == noErr)
  241.             {
  242.                 bytes += 1;
  243.                 len -= 1;
  244.                 i = 0;
  245.                 while (*bytes != ':' && len)
  246.                 {
  247.                     err_buffer[i++] = *bytes++;
  248.                     err_buffer[i] = '\0';
  249.                     len -= 1;
  250.                 }
  251.                 if (*bytes == ':')
  252.                 {
  253.                     lineNum = atoi(err_buffer);
  254.                     bytes += 1;
  255.                     len -= 1;
  256.  
  257.                     if (*bytes == ' ')
  258.                     {
  259.                         bytes += 1;
  260.                         len -= 1;
  261.                     }
  262.                     if (memcmp(bytes, "Warning: ", 9) == 0)
  263.                     {
  264.                         bytes += 9;
  265.                         len -= 9;
  266.                         warning = true;
  267.                     }
  268.  
  269.                     BlockMoveData(bytes, err_buffer, len);
  270.                     err_buffer[len] = '\0';
  271.                 }
  272.                 else
  273.                 {
  274.                     return JavaStatusOk;
  275.                 }
  276.             }
  277.         }
  278.         else
  279.         {
  280.             return JavaStatusOk;
  281.         }
  282.     }
  283.     else
  284.     {
  285.         BlockMoveData(bytes, err_buffer, len);
  286.         err_buffer[len] = '\0';
  287.     }
  288.     len = strlen(err_buffer);
  289.     if (len && err_buffer[len-1] < ' ') err_buffer[len-1] = '\0';
  290.     if(warning) {
  291.         printf("Warning: %s\n", err_buffer);
  292.     }
  293.     else {
  294.         printf("Error: %s\n", err_buffer);
  295.     }
  296. #else
  297.     mac_tools_CompilerExceptionStream_writeBytes(env, thisRef, arrayRef, off, len);
  298. #endif
  299.     return JavaStatusOk;
  300. }
  301.  
  302. /*************************************************************************************
  303.  
  304.     mac_tools_CompilerErrorStream_writeBytes_stub
  305.     
  306. *************************************************************************************/
  307.  
  308. static JavaStatus
  309. mac_tools_CompilerErrorStream_writeBytes_stub(
  310.     JavaEnv        env)
  311. {
  312.     JavaStatus    err;
  313.     JavaInt        _local_3 = JavaEnv_popInt(env);
  314.     JavaInt        _local_2 = JavaEnv_popInt(env);
  315.     JavaRef        _local_1 = JavaEnv_popRef(env);
  316.     JavaRef        _local_0 = JavaEnv_popRef(env);
  317.  
  318.     err = mac_tools_CompilerErrorStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
  319.     return err;
  320. }
  321.  
  322. /*************************************************************************************
  323.  
  324.     mac_tools_CompilerExceptionStream_writeBytes_stub
  325.     
  326. *************************************************************************************/
  327.  
  328. static JavaStatus
  329. mac_tools_CompilerExceptionStream_writeBytes_stub(
  330.     JavaEnv     env)
  331. {
  332.     JavaStatus    err;
  333.     JavaInt        _local_3 = JavaEnv_popInt(env);
  334.     JavaInt        _local_2 = JavaEnv_popInt(env);
  335.     JavaRef        _local_1 = JavaEnv_popRef(env);
  336.     JavaRef        _local_0 = JavaEnv_popRef(env);
  337.  
  338.     err = mac_tools_CompilerExceptionStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
  339.     return err;
  340. }
  341.  
  342. /*************************************************************************************
  343.  
  344.     BuildClassPathStringHandle
  345.     
  346. *************************************************************************************/
  347.  
  348. short     
  349. BuildClassPathStringHandle(
  350.     Handle         classPath,
  351.     JavaRuntime    runtime, 
  352.     FSSpec         *inFSSpec)
  353. {
  354.     Handle        curr;
  355.     OSErr    err;
  356.     long        resultSize;
  357.     FSSpec        spec, *specPtr;
  358.     short resultPaths = 0;
  359.     
  360.     specPtr = JavaRuntime_getJavaDirectory(runtime);
  361.     if(specPtr) {
  362.         spec = *specPtr;
  363.         BlockMoveData("\pclasses.zip",&spec.name,  12);
  364. //        pstrcpy((char *)specPtr->name, (char *)"\pclasses.zip"); 
  365.         curr = GetFullUnixPath(&spec);
  366.         if(curr) {
  367.             err = HandAndHand(curr, classPath);
  368.             PtrAndHand(":", classPath, 1);
  369.             DisposeHandle(curr);
  370.             resultPaths++;
  371.         }
  372.     }
  373.     
  374.     if(inFSSpec) {
  375.         curr = GetFullUnixPathFromDirID(inFSSpec->vRefNum, inFSSpec->parID);
  376.         if(curr) {
  377.             err = HandAndHand(curr, classPath);
  378.             PtrAndHand(":", classPath, 1);
  379.             DisposeHandle(curr);
  380.             resultPaths++;
  381.         }
  382.     }
  383.     
  384.  
  385.     resultSize = GetHandleSize(classPath);
  386.     if(resultSize > 0) {
  387.         (*classPath)[resultSize-1] = 0;
  388.         SetHandleSize(classPath, resultSize - 1); //Get rid of the last :
  389.     }
  390.     
  391.     return resultPaths;
  392. }
  393.  
  394. /*************************************************************************************
  395.  
  396.     Java_ProcessFile
  397.     
  398. *************************************************************************************/
  399.  
  400. OSErr    
  401. Java_ProcessFile(
  402.     FSSpec     *inFSSpec)
  403. {
  404.     JavaEnv                env;
  405.     JavaStatus            err;
  406.     JavaRef                argRef;
  407.     JavaRef                argvRef;
  408.     JavaRef                classRef;
  409.     JavaRuntime            runtime;
  410.     Handle                thePath, classPath;
  411.     short                argCount = 4;
  412.     Boolean                depends, nowarn, debugInfo, optimize;
  413.  
  414.     thePath = GetFullPathName(inFSSpec);
  415.     if (thePath == NULL)
  416.     {
  417.         err = 15004;
  418.         goto done;        // hmmmm....goto....
  419.     }
  420.  
  421.     //////////////////////////////////////////////////////////////////////
  422.     // Get a JavaRuntime instance for use by our droplet.
  423.     //////////////////////////////////////////////////////////////////////
  424.     
  425.     if ((runtime = GetJavaRuntime()) == NULL) 
  426.     {
  427.         return 15003;
  428.     }
  429.     
  430.     classPath = NewHandle(0);
  431.     BuildClassPathStringHandle(classPath, runtime, inFSSpec);
  432.  
  433.     //////////////////////////////////////////////////////////////////////
  434.     // tell the Java runtime what kind of file to create
  435.     // and where to create them.
  436.     //////////////////////////////////////////////////////////////////////
  437.     
  438.     JavaRuntime_setOutputFileType(runtime, 'Clss');
  439.     JavaRuntime_setHomeDirectory(runtime, inFSSpec);
  440.  
  441.     //////////////////////////////////////////////////////////////////////
  442.     // ask the runtime to find a java class
  443.     //////////////////////////////////////////////////////////////////////
  444.     
  445.     err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerErrorStream");
  446.     if (err != JavaStatusOk)
  447.     {
  448.         goto done;
  449.     }
  450.     
  451.     err = JavaRuntime_setMethod(runtime, classRef,
  452.         "writeBytes", "([BII)V", mac_tools_CompilerErrorStream_writeBytes_stub,
  453.         NULL, JavaAccessMember);
  454.     if (err != JavaStatusOk)
  455.     {
  456.         goto done;
  457.     }
  458.     
  459.     err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerExceptionStream");
  460.     if (err != JavaStatusOk)
  461.     {
  462.         goto done;
  463.     }
  464.     
  465.     err = JavaRuntime_setMethod(runtime, classRef,
  466.         "writeBytes", "([BII)V", mac_tools_CompilerExceptionStream_writeBytes_stub,
  467.         NULL, JavaAccessMember);
  468.     if (err != JavaStatusOk)
  469.     {
  470.         goto done;
  471.     }
  472.  
  473.     //////////////////////////////////////////////////////////////////////
  474.     // this may look stupid, but really it's not.  :-)
  475.     // In Roaster, you set these up via the preferences dialog
  476.     // box.  Here, we don't get that fancy.  But we have left the
  477.     // code here to show how we deal with those options in interacting
  478.     // with the Java Runtime
  479.     //////////////////////////////////////////////////////////////////////
  480.     
  481.     depends = false;
  482.     nowarn = false;
  483.     debugInfo = true;
  484.     optimize = false;
  485.     
  486.     if (depends) argCount++;
  487.     if (nowarn) argCount++;
  488.     if (debugInfo) argCount++;
  489.     if (optimize) argCount++;
  490.     
  491.     //////////////////////////////////////////////////////////////////////
  492.     //
  493.     //////////////////////////////////////////////////////////////////////
  494.     
  495.     env = JavaEnv_make(runtime, (JavaOSThread) NULL);
  496.     if (env == NULL)
  497.     {
  498.         err = JavaStatusOutOfMemory;
  499.         goto done;
  500.     }
  501.     err = JavaArray_makeUTF(env, &argvRef, "[Ljava/lang/String;", argCount);
  502.     if (err != JavaStatusOk)
  503.     {
  504.         goto done;
  505.     }
  506.     err = JavaString_makeUTF(env, &argRef, "-verbose", -1);
  507.     if (err != JavaStatusOk)
  508.     {
  509.         goto done;
  510.     }
  511.     err = JavaArray_setElement(env, argvRef, 0, argRef);
  512.     if (err != JavaStatusOk)
  513.     {
  514.         goto done;
  515.     }
  516.     argCount = 1;
  517.     
  518.     if (depends) // check dependencies
  519.     {
  520.         err = JavaString_makeUTF(env, &argRef, "-depend", -1);
  521.         if (err != JavaStatusOk)
  522.         {
  523.             goto done;
  524.         }
  525.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  526.         if (err != JavaStatusOk)
  527.         {
  528.             goto done;
  529.         }
  530.     }
  531.  
  532.     if (nowarn) // show warnings?
  533.     {
  534.         err = JavaString_makeUTF(env, &argRef, "-nowarn", -1);
  535.         if (err != JavaStatusOk)
  536.         {
  537.             goto done;
  538.         }
  539.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  540.         if (err != JavaStatusOk)
  541.         {
  542.             goto done;
  543.         }
  544.     }
  545.  
  546.     if (debugInfo) // show debug information
  547.     {
  548.         err = JavaString_makeUTF(env, &argRef, "-g", -1);
  549.         if (err != JavaStatusOk)
  550.         {
  551.             goto done;
  552.         }
  553.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  554.         if (err != JavaStatusOk)
  555.         {
  556.             goto done;
  557.         }
  558.     }
  559.  
  560.     if (optimize) // optimize the compile?
  561.     {
  562.         err = JavaString_makeUTF(env, &argRef, "-O", -1);
  563.         if (err != JavaStatusOk)
  564.         {
  565.             goto done;
  566.         }
  567.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  568.         if (err != JavaStatusOk)
  569.         {
  570.             goto done;
  571.         }
  572.     }
  573.  
  574.     if (classPath)  
  575.     {
  576.         err = JavaString_makeUTF(env, &argRef, "-classpath", -1);
  577.         if (err != JavaStatusOk)
  578.         {
  579.             goto done;
  580.         }
  581.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  582.         if (err != JavaStatusOk)
  583.         {
  584.             goto done;
  585.         }
  586.  
  587.         HLock(classPath);
  588.         err = JavaString_makeUTF(env, &argRef, *classPath, GetHandleSize(classPath));
  589.         DisposeHandle(classPath);
  590.         if (err != JavaStatusOk)
  591.         {
  592.             goto done;
  593.         }
  594.  
  595.         err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  596.         if (err != JavaStatusOk)
  597.         {
  598.             goto done;
  599.         }
  600.     }
  601.     
  602.     HLock(thePath);
  603.     err = JavaString_makeUTF(env, &argRef, *thePath, GetHandleSize(thePath));
  604.     DisposeHandle(thePath);
  605.     if (err != JavaStatusOk)
  606.     {
  607.         goto done;
  608.     }
  609.     err = JavaArray_setElement(env, argvRef, argCount++, argRef);
  610.     if (err != JavaStatusOk)
  611.     {
  612.         goto done;
  613.     }
  614.  
  615.     SetCursor(*GetCursor(watchCursor));
  616.  
  617.     err = JavaObject_callStaticUTF(env, NULL, "mac/tools/javac",
  618.         "main", "([Ljava/lang/String;)V", argvRef);
  619.  
  620.     JavaEnv_dispose(env);
  621.  
  622.     JavaRuntime_setOutputFileType(runtime, 'TEXT');
  623.  
  624.     
  625.     InitCursor();
  626.  
  627. done:
  628.     return err;
  629.  
  630.  
  631. }